use std::cell::{Cell, RefCell};

#[derive(Debug)]
struct Bag {
    item: Box<u32>,
}

fn main() {
    // 编译不通过
    /*
    let mut bag = Cell::new(Bag { item: Box::new(1) });
    let hand1 = &mut bag;
    let hand2 = &mut bag;
    *hand1 = Cell::new(Bag { item: Box::new(2) });
    *hand2 = Cell::new(Bag { item: Box::new(2) });
    */

    // 编译通过
    // Cell<T>类型为智能指针类型，可以为值提供可变性（极低的开销）
    // new, get, set
    let bag = Cell::new(Bag { item: Box::new(1) });
    let hand1 = &bag;
    let hand2 = &bag;
    hand1.set(Bag { item: Box::new(2) });
    hand2.set(Bag { item: Box::new(2) });

    // RefCell: 非Copy类型
    let bag = RefCell::new(Bag { item: Box::new(1) });
    let hand1 = &bag;
    let hand2 = &bag;
    *hand1.borrow_mut() = Bag { item: Box::new(2) };
    *hand2.borrow_mut() = Bag { item: Box::new(3) };
}